package opf5.ui;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JCheckBox;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JButton;

import org.omg.CORBA.TCKind;

import opf5.entities.condicionesInscripcion.CondicionCompuesta;
import opf5.entities.condicionesInscripcion.CondicionJugadoresEdad;
import opf5.entities.condicionesInscripcion.CondicionLugar;
import opf5.entities.inscripciones.CondicionDeInscripcion;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;

public class VistaCondicionesInscripcion {

	private JFrame frame;
	private JTextField txtLugar;
	private JTextField txtEdad;
	private JTextField txtCantidad;
	private VistaInscripcionPartido vistaInscripcionPartido;
	private JCheckBox chckbxSeJuegaEn;
	private JCheckBox chckbxLimiteDeJugadores;

	
	/**
	 * @wbp.parser.entryPoint
	 */
	public VistaCondicionesInscripcion() {
		frame = new JFrame();
		frame.setBounds(100, 100, 233, 215);
		frame.getContentPane().setLayout(null);
		
		chckbxSeJuegaEn = new JCheckBox("Se juega en:");
		chckbxSeJuegaEn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (chckbxSeJuegaEn.isSelected())
					txtLugar.setEnabled(true);
				else
					txtLugar.setEnabled(false);
			}
		});
		chckbxSeJuegaEn.setBounds(6, 36, 97, 23);
		frame.getContentPane().add(chckbxSeJuegaEn);
		
		txtLugar = new JTextField();
		txtLugar.setBounds(127, 37, 86, 20);
		frame.getContentPane().add(txtLugar);
		txtLugar.setColumns(10);
		
		chckbxLimiteDeJugadores = new JCheckBox("Limite de jugadores menores");
		chckbxLimiteDeJugadores.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (chckbxLimiteDeJugadores.isSelected()) {
					txtEdad.setEnabled(true);
					txtCantidad.setEnabled(true);
				} else {
					txtEdad.setEnabled(false);
					txtCantidad.setEnabled(false);
				}
			}
		});
		chckbxLimiteDeJugadores.setBounds(6, 62, 207, 23);
		frame.getContentPane().add(chckbxLimiteDeJugadores);
		
		JLabel lblEdad = new JLabel("Edad:");
		lblEdad.setBounds(57, 92, 35, 14);
		frame.getContentPane().add(lblEdad);
		
		JLabel lblCantidad = new JLabel("Cantidad:");
		lblCantidad.setBounds(57, 117, 56, 14);
		frame.getContentPane().add(lblCantidad);
		
		txtEdad = new JTextField();
		txtEdad.setBounds(127, 89, 86, 20);
		frame.getContentPane().add(txtEdad);
		txtEdad.setColumns(10);
		
		txtCantidad = new JTextField();
		txtCantidad.setBounds(127, 114, 86, 20);
		frame.getContentPane().add(txtCantidad);
		txtCantidad.setColumns(10);
		
		JLabel lblCondicionesDeInscripcion = new JLabel("Condiciones de inscripcion");
		lblCondicionesDeInscripcion.setBounds(6, 11, 207, 14);
		frame.getContentPane().add(lblCondicionesDeInscripcion);
		
		
		
		JButton btnAceptar = new JButton("Aceptar");
		btnAceptar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				runActualizarCondicion();
			}
		});
		btnAceptar.setBounds(124, 145, 89, 23);
		frame.getContentPane().add(btnAceptar);
	}
	
	/**
	 * @param vistaInscripcionPartido 
	 * @wbp.parser.entryPoint
	 */
	public void initialize(VistaInscripcionPartido vistaInscripcionPartido) {
		this.vistaInscripcionPartido = vistaInscripcionPartido;
		
		limpiar();
		
		final VistaCondicionesInscripcion window = this;
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	private void limpiar() {
		chckbxLimiteDeJugadores.setSelected(false);
		chckbxSeJuegaEn.setSelected(false);
		txtCantidad.setText("");
		txtCantidad.setEnabled(false);
		txtEdad.setText("");
		txtEdad.setEnabled(false);
		txtLugar.setText("");
		txtLugar.setEnabled(false);
	}

	protected void runActualizarCondicion() {
		if (! datosValidos())
			return;
		
		this.vistaInscripcionPartido.setCondicion(this.getCondicion());
		JOptionPane.showMessageDialog(frame, "Condicion actualizada.");
		this.frame.setVisible(false);
	}

	private boolean datosValidos() {
		if (chckbxSeJuegaEn.isSelected()) {
			if (txtLugar.getText().isEmpty()) {
				JOptionPane.showMessageDialog(frame, "Debe especificar un lugar.");
				return false;
			}
		}
		if (chckbxLimiteDeJugadores.isSelected()) {
			if (! txtEdad.getText().matches("[0-9]{1,2}")) {
				JOptionPane.showMessageDialog(frame, "Debe especificar una edad valida.");
				return false;
			}
			if (! txtCantidad.getText().matches("[0-9]{1,2}")) {
				JOptionPane.showMessageDialog(frame, "Debe especificar una cantidad de jugadores valida.");
				return false;
			}
		}
		
		return true;
	}

	private CondicionDeInscripcion getCondicion() {
		List<CondicionDeInscripcion> condiciones = new ArrayList<CondicionDeInscripcion>();

		if (this.chckbxSeJuegaEn.isSelected()) {
			condiciones.add(new CondicionLugar(this.txtLugar.getText()));
		}
		
		if (this.chckbxLimiteDeJugadores.isSelected()) {
			condiciones.add(new CondicionJugadoresEdad(
					new Integer(this.txtEdad.getText()),
					new Integer(this.txtCantidad.getText())));
		}
		
		return new CondicionCompuesta(condiciones);
	}
}
